/*
主协程执行的时间短（表现在比较短），子协程执行时间比较长（表现在比较长） 我们一定要记住，子协程是相对于当前的主协程来说的，如果主协程不存在了，那就没有子协程了
Golang 中的并发是函数相互独立运行的能力。Goroutines 是并发运行的函数。Golang 提供了 Goroutines 作为并发处理操作的一种方式。
创建一个协程非常简单，就是在一个任务函数前面添加一个go关键字：
go task()
*/
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func Show(msg string) {
	for i := 1; i < 5; i++ {
		fmt.Printf("msg:%v\n", msg)
		time.Sleep(time.Millisecond * 100)
	}
}

func Resp(url string) {
	fmt.Printf("\nstep1: ", url)
	response, err := http.Get(url)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("\nstep2: ", url)
	defer response.Body.Close()

	fmt.Printf("step3: ", url)
	body, err := ioutil.ReadAll(response.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("\nstep4: ", len(body))
}
func main() {
	//在程序启动时，Go 程序就会为 main() 函数创建一个默认的 goroutine
	go Show("Golang")
	Show("Python") //在main协程中执行，如果它前面也添加go，程序并没有输出

	go Resp("https://www.daoke360.com")
	go Resp("https://www.baidu.com")
	go Resp("https://www.jd.com")
	time.Sleep(10 * time.Second)
	fmt.Println("end...")
}
